#include <string>
#include <vector>
#include <iostream>
using namespace std;

// 将vector中值为4的元素删除
void test(){
    vector<int> vec = {1,2,3,4,4,4,4,5,4,4,6};
    for(auto it = vec.begin(); it != vec.end(); it++){
        if(4 == *it){
            // 如果这个数是4就使用erase删除
            vec.erase(it);
        }
    }
    // 会出现问题：迭代器失效
    // 此时擦除元素会出现删除不干净的问题
    // 因为这样擦除是时候vector
    // 会将被删除的位置自动补齐
    // 会将后面的元素前移补全
    // 这样相当于it指针已经后移一次
    // 但是本身for中又会把it指针后移一次
    // 这样就会漏掉这个补全在被删除位置的元素的判断
    for(auto & elm : vec){
        cout  << elm << " ";
    }
    cout << endl;
}

void test1(){
    vector<int> vec = {1,2,3,4,4,4,4,5,4,6,7,8,4,4,9,10};
    for(auto it = vec.begin(); it != vec.end();){
        if(4 == *it){
            // 如果这个数是4就使用erase删除
            vec.erase(it);
        }else{

            it++;
        }
    }
    // 这样就不会出现上面的问题
    // 只有当遇到的元素不是删除元素的时候
    // 才会把it指针后移这样就避免了会后移两次
    // 造成的迭代器失效问题
    for(auto & elm : vec){
        cout  << elm << " ";
    }
    cout << endl;
}

int main(int atgc, char * argv[])
{
    test1();
    return 0;
}

